home *** CD-ROM | disk | FTP | other *** search
/ Macworld Expo - Develope…Central & Net Innovations / Developer Central and Net Innovators (MacWorld Expo) (January 1999).iso / Developer Central / Bowers Development / Demo AppMaker / Examples / PowerPlant / AMReminder / CMainWindow.cp < prev    next >
Encoding:
Text File  |  1998-10-18  |  6.9 KB  |  326 lines  |  [TEXT/CWIE]

  1. // CMainWindow.cp -- window methods
  2.  
  3. #include "CMainWindow.h"
  4.  
  5. #include <UEnvironment.h>
  6. #include <UReanimator.h>
  7. #include <URegistrar.h>
  8. #include <LStream.h>
  9. #include <LTabGroup.h>
  10. #include <LPictureControl.h>
  11. #include <LAMControlImp.h>
  12. #include <LGAPictureControlImp.h>
  13. #include <LStaticText.h>
  14. #include <LAMStaticTextImp.h>
  15. #include <LGAStaticTextImp.h>
  16. #include <LScrollerView.h>
  17. #include <LScrollBar.h>
  18. #include <LAMTrackActionImp.h>
  19. #include <LStdScrollBarImp.h>
  20. #include "AMPanelTableView.h"
  21. #include "CReminder.h"
  22. #include <UAttachments.h>
  23. #include <LTableMonoGeometry.h>
  24. #include <LTableSingleSelector.h>
  25. #include <LPushButton.h>
  26. #include <LAMPushButtonImp.h>
  27. #include <LGAPushButtonImp.h>
  28. #include <CTextUtils.h>
  29.  
  30. #include "DReminder.h"
  31. #include "DDocData.h"
  32. #include "CAdd.h"
  33. #include "AMReminderCmds.h"
  34.  
  35. const MessageT    msgReminders    = 'Remi';
  36.  
  37. #define PPob_MainWindowID    201
  38. #define RidL_MainWindowID    201
  39.  
  40. Boolean        CMainWindow::sIsRegistered = false;
  41.  
  42. //----------
  43. CMainWindow*        CMainWindow::CreateMainWindow (
  44.     LCommander*        inSuperCommander,
  45.     DDocData*        inData)
  46. {
  47.     if (!sIsRegistered) {
  48.         RegisterClass ();
  49.     }
  50.  
  51.     CMainWindow*        window;
  52.     window = (CMainWindow *)LWindow::CreateWindow(PPob_MainWindowID, inSuperCommander);
  53.     window->ConnectToData (inData);
  54.     return window;
  55. }
  56.  
  57. //----------
  58. #define    RegisterClasses(AbstractClass,AMImpClass,GAImpClass)    \
  59.     RegisterClass_(AbstractClass);    \
  60.     if (useAppearance) {    \
  61.         RegisterClassID_(AMImpClass, AbstractClass::imp_class_ID);    \
  62.     } else {    \
  63.         RegisterClassID_(GAImpClass, AbstractClass::imp_class_ID);    \
  64.     }
  65.  
  66. //----------
  67. void    CMainWindow::RegisterClass ()
  68. {
  69.     Boolean        useAppearance = UEnvironment::HasFeature (env_HasAppearance);
  70.  
  71.     RegisterClass_(CMainWindow);
  72.  
  73.     // register the pane classes we use
  74.     RegisterClasses (LPictureControl, LAMControlImp, LGAPictureControlImp);
  75.     RegisterClasses (LStaticText, LAMStaticTextImp, LGAStaticTextImp);
  76.     RegisterClass_(LScrollerView);
  77.     RegisterClasses (LScrollBar, LAMTrackActionImp, LStdScrollBarImp);
  78.     RegisterClass_(AMPanelTableView);
  79.     RegisterClasses (LPushButton, LAMPushButtonImp, LGAPushButtonImp);
  80.  
  81.     sIsRegistered = true;
  82. }
  83.  
  84. //----------
  85. CMainWindow::CMainWindow (
  86.     LStream*    inStream)
  87.     : LWindow (inStream)
  88. {
  89. }
  90.  
  91. //----------
  92. CMainWindow::~CMainWindow ()
  93. {
  94. }
  95.  
  96. //----------
  97. //    This member function gets called once the containment hierarchy that contains
  98. //    this pane has been built. It gives us a chance to get data members for
  99. //    interesting subviews, and to do other operations now that our subviews exist.
  100. void    CMainWindow::FinishCreateSelf ()
  101. {
  102.     mRemindersTable = (AMPanelTableView*)FindPaneByID ('Remi');
  103.     mRemindersTable->AddAttachment (new LEraseAttachment());
  104.     mRemindersTable->SetTableGeometry (new LTableMonoGeometry (mRemindersTable, 
  105.                             340, 
  106.                             15));
  107.     mRemindersTable->SetTableSelector (new LTableSingleSelector (mRemindersTable));
  108.     mRemindersTable->UsePanel (CReminder::CreateReminder (mRemindersTable, this));
  109.     mRemindersTable->SetSingleClickMessage (msgReminders);
  110.     mRemindersTable->SetDoubleClickMessage (cmdEditReminder);
  111.     mRemindersTable->AddListener (this);
  112.  
  113.     mAddButton = (LPushButton*) FindPaneByID ('Add ');
  114.  
  115.     mEditButton = (LPushButton*) FindPaneByID ('Edit');
  116.  
  117.     mDeleteButton = (LPushButton*) FindPaneByID ('Dele');
  118.  
  119.  
  120.     UReanimator::LinkListenerToControls(this, this, RidL_MainWindowID);
  121.         // "connect" self to our controls that we want to "listen" to
  122.  
  123.     // any additional initialization for your window:
  124. }
  125.  
  126. //----------
  127. void    CMainWindow::ConnectToData (
  128.     DDocData*        inData)
  129. {
  130.     mData = inData;
  131.     mData->AddListener (this);
  132.  
  133.     mRemindersTable->UseArray (mData->GetReminders ());
  134.         mRemindersTable->SetValue (mData->GetReminderChoice ());
  135.     if (mData->GetIsSelected ()) {
  136.         mEditButton->Enable ();
  137.     } else {
  138.         mEditButton->Disable ();
  139.     }
  140.     if (mData->GetIsSelected ()) {
  141.         mDeleteButton->Enable ();
  142.     } else {
  143.         mDeleteButton->Disable ();
  144.     }
  145. }
  146.  
  147. //----------
  148. void    CMainWindow::DoEditReminder ()
  149. {
  150.     DReminder*        data = new DReminder;
  151.  
  152. // hand-written "Before" code:
  153.     SInt32            index = mData->GetReminderChoice ();
  154.     DReminder*        oldItem = mData->GetReminders ()->GetNthItem (1 + index);
  155.  
  156.     data->CopyFrom (oldItem);
  157. //
  158.     CAdd*        dialog = CAdd::CreateAdd (this, cmdEditReminder, data);
  159. }
  160.  
  161. //----------
  162. void    CMainWindow::FinishEditReminder (
  163.     void*        ioParam)
  164. {
  165.     CAdd*            dialog = (CAdd *)ioParam;
  166.     DReminder*        data = dialog->GetData ();
  167.  
  168. // hand-written "If true" code:
  169.     SInt32            index = mData->GetReminderChoice ();
  170.     DReminder*        oldItem = mData->GetReminders ()->GetNthItem (1 + index);
  171.  
  172.     oldItem->CopyFrom (data);
  173.     mData->GetReminders ()->ChangedNth (1 + index);
  174. //
  175.     delete dialog;
  176. }
  177.  
  178. //----------
  179. void    CMainWindow::DoAddReminder ()
  180. {
  181.     DReminder*        data = new DReminder;
  182.  
  183.  
  184.     // pre-invoke code
  185.  
  186.     CAdd*        dialog = CAdd::CreateAdd (this, cmdAddReminder, data);
  187. }
  188.  
  189. //----------
  190. void    CMainWindow::FinishAddReminder (
  191.     void*        ioParam)
  192. {
  193.     CAdd*            dialog = (CAdd *)ioParam;
  194.     DReminder*        data = dialog->GetData ();
  195.  
  196. // hand-written:
  197.     DReminder*        newItem = new DReminder;
  198.  
  199.     newItem->CopyFrom (data);
  200.     mData->GetReminders ()->AddItem (newItem);
  201. //
  202.  
  203.     delete dialog;
  204. }
  205.  
  206. //----------
  207. void    CMainWindow::DoDeleteReminder ()
  208. {
  209.         SInt32            index = mData->GetReminderChoice ();
  210.     mData->GetReminders ()->RemoveNth (1 + index);
  211. //    GetEngine ()->SetDirty ();
  212.  
  213. }
  214.  
  215. //----------
  216. void    CMainWindow::DataChanged (
  217.     long        inDataID)
  218. {
  219.     StopListening ();
  220.  
  221.     if (inDataID == idReminderChoice) {
  222.         mRemindersTable->SetValue (mData->GetReminderChoice ());
  223.     }
  224.     if (inDataID == idIsSelected) {
  225.         if (mData->GetIsSelected ()) {
  226.             mEditButton->Enable ();
  227.         } else {
  228.             mEditButton->Disable ();
  229.         }
  230.     }
  231.     if (inDataID == idIsSelected) {
  232.         if (mData->GetIsSelected ()) {
  233.             mDeleteButton->Enable ();
  234.         } else {
  235.             mDeleteButton->Disable ();
  236.         }
  237.     }
  238.  
  239.     StartListening ();
  240. }
  241.  
  242. //----------
  243. void    CMainWindow::ListenToMessage (
  244.     MessageT    inMessage,
  245.     void*        ioParam)
  246. {
  247.     switch (inMessage) {
  248.     case msgDataChanged:
  249.             DataChanged ((long)ioParam);
  250.         break;
  251.  
  252.     case msgReminders:
  253.             mData->SetReminderChoice (mRemindersTable->GetValue ());
  254.         break;
  255.  
  256.     case cmdEditReminder:
  257.             DoEditReminder ();
  258.         break;
  259.  
  260.     case cmdAddReminder:
  261.             DoAddReminder ();
  262.         break;
  263.  
  264.     case cmdDeleteReminder:
  265.             DoDeleteReminder ();
  266.         break;
  267.  
  268.     default:
  269.           ; // do something
  270.         break;
  271.     }
  272. }
  273.  
  274. //----------
  275. Boolean        CMainWindow::ObeyCommand (
  276.     CommandT    inCommand,
  277.     void*        ioParam)
  278. {
  279.     Boolean        cmdHandled = true;
  280.  
  281.     if (inCommand < 0) {
  282.         // modal dialog has finished
  283.  
  284.         switch (-inCommand) {
  285.         case cmdEditReminder:    
  286.                 FinishEditReminder (ioParam);
  287.             break;
  288.  
  289.         case cmdAddReminder:    
  290.                 FinishAddReminder (ioParam);
  291.             break;
  292.  
  293.         }
  294.  
  295.     } else {
  296.         switch (inCommand) {
  297.  
  298.         default:
  299.                 cmdHandled = LWindow::ObeyCommand(inCommand, ioParam);
  300.             break;
  301.         }
  302.     }
  303.  
  304.     return cmdHandled;
  305. }
  306.  
  307. //----------
  308. void    CMainWindow::FindCommandStatus (
  309.     CommandT    inCommand,
  310.     Boolean        &outEnabled,
  311.     Boolean        &outUsesMark,
  312.     Char16        &outMark,
  313.     Str255        outName)
  314. {
  315.     outUsesMark = false;
  316.  
  317.     switch (inCommand) {
  318.  
  319.  
  320.     default:
  321.             LWindow::FindCommandStatus(inCommand, outEnabled,
  322.                                         outUsesMark, outMark, outName);
  323.         break;
  324.     }
  325. }
  326.